package main

import "strings"

func longestPalindrome(s string) string {
	var result string // 结果

	slen := len(s) // s的长度
	if slen == 0 || slen == 1 {
		result = s
	} else {
		// var tempString string       // 前一个子串
		// sRunes := []rune(s) // s的Unicode字符切片
		huiwenRunes := []rune{}     // 回文字符切片
		huiwenStrings := []string{} // 回文字符串切片

		// i := 0
		for i, v := range s {
			idxLast := strings.LastIndex(s, string(v))
			huiwenRunes = append(huiwenRunes, v)

			if idxLast > -1 && i < idxLast { // 当前字符有重复
				substr := s[i : idxLast+1] // 按该字符的首尾索引取出子串
				ishuiwen := true           // 是否回文

				j := 0                                         // 当前字符在子串中的起始索引
				idxLast = strings.LastIndex(substr, string(v)) // 当前字符在子串中的截止索引(注意上面是s此处是substr)
				instr := substr
				for m, n := j, idxLast; m <= n; {
					if instr[m] != instr[n] {
						idxEnd := len(instr) - 1
						instr = instr[0:idxEnd]

						// afterstr := instr[1:] // instr中除掉当前字符的剩余部分
						idxLast = strings.LastIndex(instr, string(v))
						if idxLast > 0 { // 等于-1或者0都表示排除首字符的剩余部分已找不到相同字符
							instr = instr[:idxLast+1]
							m, n = 1, idxLast-1
							if m < n {
								continue
							}
						} else {
							// if idxLast == -1 {
							// 	ishuiwen = false
							// }
							ishuiwen = false
							break
						}
					}
					if m == n {
						break
					}
					m, n = m+1, n-1
				}

				if ishuiwen {
					huiwenStrings = append(huiwenStrings, instr)
				}
				i++
			}
		}

		maxlen := 0
		if len(huiwenStrings) == 0 { // 没有取得任何回文字符串
			// 那就只能从回文字符切片中取一个
			if len(huiwenRunes) > 0 {
				result = string(huiwenRunes[0])
			}
		} else { // 从回文字符串切片中取最长的
			for _, v := range huiwenStrings {
				if len(v) > maxlen {
					maxlen = len(v)
					result = v
				}
			}
		}
	}
	return result
}
